/*
    7-10 单链表基本操作
请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列，输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:
输入第1行为1个正整数n，表示当前单链表长度；第2行为n个空格间隔的整数，为该链表n个元素的数据域值。
第3行为1个正整数m，表示对该链表施加的操作数量；接下来m行，每行表示一个操作，为2个或3个整数，格式为0 k d或1 k。
0 k d表示在链表第k个结点后插入一个数据域值为d的结点，若k=0则表示表头插入。1 k表示删除链表中第k个结点，此时k不能为0。
注：操作序列中若含有不合法的操作（如在长度为5的链表中删除第8个结点、删除第0个结点等），则忽略该操作。n和m不超过100000。

输出格式:
输出为一行整数，表示实施上述m个操作后的链表，每个整数后一个空格。输入数据保证结果链表不空。

输入：
    5
    1 2 3 4 5
    5
    0 2 8
    0 9 6
    0 0 7
    1 0 
    1 6

输出：7 1 2 8 3 5 

*/

//最好还是不要用链表来做，比较麻烦，还是用STL做比较方便，STL做的代码放到STL的文件夹下了
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
    int data;
    struct Node*next;
}node;
node* head=NULL;
node* rear;
void insertend(node* temp)
{
    if(head==NULL)
    {
        head=temp;
        rear=temp;
        rear->next=NULL;
    }
    else
    {
        rear->next=temp;
        rear=temp;
        rear->next=NULL;
    }
}
void insert(node*temp,int k,int d)
{
    if(k==0)
    {
        temp->data=d;
        temp->next=head;
        head=temp;
    }
    else
    {
        node* p0=head;
        while(k-1>0)
        {
            p0=p0->next;
            k--;
        }
        temp->next=p0->next;
        p0->next=temp;
        temp->data=d;
    }
}
//当时这里的命名是delete时，会报错，可能是因为delete是关键字，会命名冲突，改成deleteList之后就不会报错了
void deleteList(int k)
{
    node* p=head;
    int nm=1;
    while(p!=NULL&&nm<k-1)
    {
        p=p->next;
        nm++;
    }
    node*q=p;p=p->next;
    if(p->next!=NULL)
    {
        q->next=p->next;
        free(p);
    }
    else
    {
        q->next=NULL;
        free(p);
    }
}
int main()
{
    int n,i;
    int num;
    node*p;
    int m;
    scanf("%d",&n);
    for(i=0;i<n;i++) 
    {
        node*n=(node*)malloc(sizeof(struct Node));
        insertend(n);
    }
    p=head; 
    while(p!=NULL)
    {
        scanf("%d",&num);
        p->data=num;
        p=p->next;
    }
    scanf("%d",&m);
    int n1,n2,n3;
    for(i=0;i<m;i++)
    {
    scanf("%d",&n1);
    if(n1==0)
    {
    scanf("%d",&n2);
                scanf("%d",&n3);
    if(n2>=0&&n2<=n)
                {
        node*temp=(node*)malloc(sizeof(struct Node));
        insert(temp,n2,n3);
        n++;
                }
    }
    if(n1==1)
    {
    scanf("%d",&n2);
    if(n2>0&&n2<=n)
    {
        deleteList(n2);
        n--;
    }
    }
    }
    p=head;
    while(p!=NULL)
        {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    return 0;
}
